Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.10.2016, 16:44
Интересующийся
Отправить личное сообщение для prog_f130 Посмотреть профиль Найти все сообщения от prog_f130
 
Регистрация: 24.08.2016
Сообщений: 20

Динамическое построение дерева
Добрый день. Цель при клике по узлу дерева подгружать дочерние элементы.

При открытии страницы загружаются самые нижние узлы.
По такому принципу и
<ul id="n-ul-Top" class="TreeContainer">
  <li id="57fdd652c4a59fea5821da98" class="Node IsRoot">
    Theme 1
    <ul id="n-ul-57fdd652c4a59fea5821da98" class="TreeContainer"></ul>
  </li>
</ul>


На клик по li вешается обработчик.
(function($, undefined) {
    $(function(){
        $('li.Node').click(function(){
         
            var target_ul='#n-ul-'+$(this).attr("id");
            var url='/catalog/'+$(this).attr("id");
            console.log($(this).attr("id"));
            $.getJSON(url, function(data){
                data.forEach(function(item) {
                    $(target_ul).append('<li class="Node" id='+item._id+'>'+item.caption+'</li>');
                    
                    $('#'+item._id).append('<ul class="TreeContainer" id="n-ul-'+item._id+'">');
                });
            });
            return false;
        });
    });    
})(jQuery);


Проблема в том, что корректно добавляются только элементы в корневые узлы, которые были построены заранее, а при клике по дочерним, которые были динамически отрисованы операция повторяется для коренных узлов, т.е. console.log($(this).attr("id"));
в любом случае возвращает id коренного li, хотя если смотреть разметку id присвоены верно. ЧЯДНТ? Спасибо.

P.S. Только сейчас заметил, что есть отдельный раздел JQuery, сорян, что промахнулся.

Последний раз редактировалось prog_f130, 12.10.2016 в 16:54. Причина: Ошибся :(
Ответить с цитированием
  #2 (permalink)  
Старый 12.10.2016, 16:57
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,149

prog_f130,
... клик ставят на то что есть всегда ... если это body то на body , чем ближе тем лучше ... и всплытие клика по дереву отменяют , иначе сработают все узлы вверх ...
$('body').on('click','li.Node',function(event){ event.preventDefault()
Ответить с цитированием
  #3 (permalink)  
Старый 12.10.2016, 17:01
Интересующийся
Отправить личное сообщение для prog_f130 Посмотреть профиль Найти все сообщения от prog_f130
 
Регистрация: 24.08.2016
Сообщений: 20

Дак вроде бы return false; прерывает всплытие?
И к тому же в таком случае console.log($(this).attr("id")) вывел бы последовательно все id начиная с дочерних, а не только родительского?
Ответить с цитированием
  #4 (permalink)  
Старый 12.10.2016, 17:08
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,149

Сообщение от prog_f130
Дак вроде бы return false; прерывает всплытие?
ок. в остальном читайте про делегирование, jquery не телепат, и у неё нет механизма слежения за добавлением новых элементов.
Ответить с цитированием
  #5 (permalink)  
Старый 13.10.2016, 10:05
Интересующийся
Отправить личное сообщение для prog_f130 Посмотреть профиль Найти все сообщения от prog_f130
 
Регистрация: 24.08.2016
Сообщений: 20

Спасибо за совет, изучил. Если кому нужно, получился такой скрипт:
(function($, undefined) {
    $(function(){
        $('ul#n-ul-Top').click(function(event){
            var target, target_ul, url;
            
            //поддержка кроссбраузерности
            event = event || window.event;
            target = event.target || event.srcElement;
            
            if (target.tagName !== 'LI') return false;
            target_ul='#n-ul-'+target.id;
            url='/catalog/'+target.id;
            
            if ($(target).hasClass("isOpen")){
                $(target).removeClass("isOpen");
                $(target_ul).empty();
            } else{
                $.getJSON(url, function(data){
                    $(target).addClass("isOpen");
                    data.forEach(function(item) {
                        $(target_ul).append('<li class="Node" id='+item._id+'>'+item.caption+'</li>');
                        $('#'+item._id).append('<ul class="TreeContainer" id="n-ul-'+item._id+'">');
                    });
                });    
            }
            return false;
        });
    });    
})(jQuery);
Ответить с цитированием
  #6 (permalink)  
Старый 13.10.2016, 10:10
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,149

prog_f130,
в формате jquery не изучили, смотрите пост 2 и выкиньте строки 6 - 10 пост 5
Ответить с цитированием
  #7 (permalink)  
Старый 19.10.2016, 08:52
Интересующийся
Отправить личное сообщение для prog_f130 Посмотреть профиль Найти все сообщения от prog_f130
 
Регистрация: 24.08.2016
Сообщений: 20

Да, я уже понял, переписал
(function($, undefined) {
    $(function(){
        $('ul#t-ul-Top').delegate("a", "click", function(){
            //....
            $.getJSON(url, function(data){
            //...
            }
            return false;
        });    
    });    
})(jQuery);
Ответить с цитированием
  #8 (permalink)  
Старый 19.10.2016, 08:58
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,149

Сообщение от prog_f130
delegate
нет такой буквы!!! есть on порядок аргументов смотрите в документации http://api.jquery.com/on/ или в посте №2
P.S. обновите версию jquery

Последний раз редактировалось рони, 19.10.2016 в 09:01.
Ответить с цитированием
  #9 (permalink)  
Старый 19.10.2016, 17:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,149

Rise,
рекомендации использовать on уже давно прописаны в документации delegate
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое создание дерева объекта mu_vi Общие вопросы Javascript 4 22.01.2015 11:53
Удаление из дерева serigc Серверные языки и технологии 0 11.11.2014 14:16
Загрузка/Сохранение дерева anonim_14 ExtJS 1 05.11.2014 22:45
Построение дерева из xml файла palan ExtJS 0 10.04.2013 10:03
Динамическое построение ColumnModel ScP ExtJS 8 07.05.2010 14:55